// src/utils/request.ts
import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
import { message, Modal } from 'antd';
import { getToken, clearToken } from './auth'; // 假设有一个 auth 工具类


// 业务错误码白名单（这些错误不显示全局错误提示）
const BUSINESS_ERROR_WHITE_LIST = [401, 402, 403];
// 创建 axios 实例
const service = axios.create({
    baseURL:'api', // 从环境变量获取基础 API 地址
    timeout: 10000, // 请求超时时间
});

// 请求拦截器
service.interceptors.request.use(
    (config) => {
        // 在发送请求之前做些什么
        const token = getToken();
        if (token) {
            config.headers = {
                ...config.headers,
                Authorization: `Bearer ${token}`,
            };
        }
        return config;
    },
    (error) => {
        // 对请求错误做些什么
        return Promise.reject(error);
    }
);

// 响应拦截器
service.interceptors.response.use(
    (response) => {
        const res = response.data;

        // 业务逻辑判断
        if (res.code !== 200) {
            // 如果是白名单内的错误码，直接reject，不显示全局错误提示
            if (BUSINESS_ERROR_WHITE_LIST.includes(res.code)) {
                return Promise.reject(res);
            }
            // 处理业务错误
            handleBusinessError(res);
            return Promise.reject(new Error(res.message || 'Error'));
        }

        return res.data; // 直接返回有用的数据部分
    },
    (error) => {
        // 处理 HTTP 错误
        handleHttpError(error);
        return Promise.reject(error);
    }
);

// 处理业务错误
function handleBusinessError(res) {
    const { code, message: msg } = res;

    switch (code) {
        case 401:
            // 未授权，跳转到登录页
            Modal.confirm({
                title: '登录已过期',
                content: '您的登录状态已过期，请重新登录',
                okText: '重新登录',
                cancelText: '取消',
                onOk: () => {
                    clearToken();
                },
            });
            break;
        case 403:
            // 无权限
            message.error('您没有权限执行此操作');
            break;
        default:
            // 其他错误
            message.error(msg || '未知错误');
    }
}

// 处理 HTTP 错误
function handleHttpError(error) {
    if (error.response) {
        // 请求已发出，服务器返回状态码不在 2xx 范围内
        const { status, data } = error.response;

        switch (status) {
            case 400:
                message.error(data.message || '请求错误');
                break;
            case 404:
                message.error('请求资源未找到');
                break;
            case 500:
                message.error('服务器内部错误');
                break;
            case 504:
                message.error('网关超时');
                break;
            default:
                message.error(`连接错误 ${status}`);
        }
    } else if (error.request) {
        // 请求已发出，但没有收到响应
        message.error('网络连接异常，请检查您的网络');
    } else {
        // 发送请求时出了点问题
        message.error('请求失败，请稍后重试');
    }
}

/**
 * 封装 GET 请求
 * @param url 请求地址
 * @param params 请求参数
 * @param config 额外配置
 */
export function get(url, params, config) {
    return service.get(url, { params, ...config });
}

/**
 * 封装 POST 请求
 * @param url 请求地址
 * @param data 请求体数据
 * @param config 额外配置
 */
export function post(url, data, config) {
    return service.post(url, data, config);
}

/**
 * 封装 PUT 请求
 * @param url 请求地址
 * @param data 请求体数据
 * @param config 额外配置
 */
export function put(url, data, config) {
    return service.put(url, data, config);
}

/**
 * 封装 DELETE 请求
 * @param url 请求地址
 * @param params 请求参数
 * @param config 额外配置
 */
export function del(url, params, config) {
    return service.delete(url, { params, ...config });
}

export default service;
